package com.bank.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.dto.Result;
import com.bank.entity.TradeInfo;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 交易信息服务接口
 * 提供交易信息相关的业务逻辑处理
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
public interface TradeInfoService {

    /**
     * 新增交易记录
     * 
     * @param tradeInfo 交易信息
     * @return 操作结果
     */
    Result<TradeInfo> addTrade(TradeInfo tradeInfo);

    /**
     * 根据交易ID删除交易记录
     * 
     * @param tradeId 交易ID
     * @return 操作结果
     */
    Result<String> deleteTrade(Integer tradeId);

    /**
     * 批量删除交易记录
     * 
     * @param tradeIds 交易ID列表
     * @return 操作结果
     */
    Result<String> batchDeleteTrades(List<Integer> tradeIds);

    /**
     * 根据交易ID查询交易信息
     * 
     * @param tradeId 交易ID
     * @return 交易信息
     */
    Result<TradeInfo> getTradeById(Integer tradeId);

    /**
     * 根据卡号查询交易记录
     * 
     * @param cardId 卡号
     * @return 交易记录列表
     */
    Result<List<TradeInfo>> getTradesByCardId(String cardId);

    /**
     * 根据交易类型查询交易记录
     * 
     * @param tradeType 交易类型
     * @return 交易记录列表
     */
    Result<List<TradeInfo>> getTradesByType(String tradeType);

    /**
     * 根据交易时间范围查询交易记录（范围查询）
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录列表
     */
    Result<List<TradeInfo>> getTradesByTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据交易金额范围查询交易记录（范围查询）
     * 
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @return 交易记录列表
     */
    Result<List<TradeInfo>> getTradesByAmountRange(BigDecimal minAmount, BigDecimal maxAmount);

    /**
     * 分页查询交易记录（管理员使用，支持多条件组合查询）
     * 
     * @param page 分页参数
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return 分页结果
     */
    Result<IPage<TradeInfo>> getTradesPage(Page<TradeInfo> page, String cardId, String customerName, String tradeType,
                                          LocalDateTime startTime, LocalDateTime endTime,
                                          BigDecimal minAmount, BigDecimal maxAmount);

    /**
     * 根据卡号分页查询交易记录（客户使用）
     * 
     * @param page 分页参数
     * @param cardId 卡号
     * @param password 密码
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @return 分页结果
     */
    Result<IPage<TradeInfo>> getTradesPageByCardId(Page<TradeInfo> page, String cardId, String password,
                                                  String tradeType, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 转账操作（调用存储过程）
     * 
     * @param fromCardId 转出卡号
     * @param fromPassword 转出卡密码
     * @param toCardId 转入卡号
     * @param amount 转账金额
     * @param remark 备注
     * @return 操作结果
     */
    Result<String> transfer(String fromCardId, String fromPassword, String toCardId, BigDecimal amount, String remark);

    /**
     * 获取交易统计信息
     * 
     * @return 交易统计信息
     */
    Result<Map<String, Object>> getTradeStatistics();

    /**
     * 根据交易类型统计交易数量
     * 
     * @param tradeType 交易类型
     * @return 交易数量
     */
    Result<Integer> getTradeCountByType(String tradeType);

    /**
     * 根据交易类型统计交易金额
     * 
     * @param tradeType 交易类型
     * @return 交易金额总和
     */
    Result<BigDecimal> getTradeAmountByType(String tradeType);

    /**
     * 获取指定时间范围内的交易统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果列表
     */
    Result<List<Map<String, Object>>> getTradeStatisticsByTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取月度交易汇总统计
     * 
     * @param year 年份
     * @param month 月份
     * @return 月度统计结果
     */
    Result<List<Map<String, Object>>> getMonthlyTradeStatistics(Integer year, Integer month);

    /**
     * 获取银行卡交易额统计（用于报表）
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 银行卡交易额统计
     */
    Result<List<Map<String, Object>>> getCardTradeAmountStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 导出交易记录到CSV文件
     * 
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return CSV文件内容
     */
    Result<String> exportTradesToCSV(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 导出交易统计报表到CSV文件
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return CSV文件内容
     */
    Result<String> exportTradeStatisticsToCSV(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 验证交易信息的完整性和合法性
     * 
     * @param tradeInfo 交易信息
     * @return 验证结果
     */
    Result<Void> validateTradeInfo(TradeInfo tradeInfo);
}
